#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include <unistd.h>

struct msgbuf {
    long mtype;
    char mtext[100];
};

int main() {
    key_t key;
    int msgid;

    key = ftok("/tmp/example", 'R');
    msgid = msgget(key, 0666 | IPC_CREAT);

    if (msgid == -1) {
        perror("msgget");
        exit(1);
    }

    #define MSGTYPE 1
    #define MSGTYPE2 2

    // 1.发送 msgtype = 1的数据
    struct msgbuf msg;
    msg.mtype = MSGTYPE;
    strcpy(msg.mtext, "Hello, world!");
    if (msgsnd(msgid, &msg, strlen(msg.mtext) + 1, 0) == -1) {
        perror("msgsnd");
        exit(1);
    }

    // 2.接受相同的 msgtype
    struct msgbuf rcv;
    if (msgrcv(msgid, &rcv, sizeof(rcv.mtext), MSGTYPE, 0) == -1) {
        perror("msgrcv");
        exit(1);
    }
    printf("Received message: %s\n", rcv.mtext);

    // 3.接受不同的 msgtype
    struct msgbuf rcv2;
    if (msgrcv(msgid, &rcv2, sizeof(rcv2.mtext), MSGTYPE2, IPC_NOWAIT) == -1) {
        perror("msgrcv MSGTYPE2 failed");
    }

    return 0;
}

/* 
Received message: Hello, world!
msgrcv MSGTYPE2 failed: No message of desired type
 */